// door.txt - This is the basic script that powers all doors. If you are 
// working on a scenario that contains doors, DO NOT REMOVE THIS SCRIPT.

// This version of door.txt is a revision by Ephesos, to finally separate
// out the door's physical strength and lock strength. Of course, the designer
// still has the option to leave them lumped together, but why would you?

// The snippets of code at the beginning of each state check to make sure that
// nothing else has changed the terrain under the script. Those are Niemand's
// doing.

// Also, I've included the ability to have a town script state be triggered by
// the door opening. Useful for one-shot messages.

// Finally, this version of the script has been updated so that it the door's
// difficulty can be adjusted manually, via the set_terrain_memory_cell call.

// Memory Cells - 
//   0 - Lock level. If left at 0, door is unlocked. Otherwise, the strength/tool
//     use needed to get it open. If this is set to a really high number (say, 200),
//     it can't be unlocked by normal means
//   1 - Key needed. If left at 0, no special item helps unlock the door. Otherwise,
//     if that party has this special item, the door automatically unlocks.
//   2,3 - Coordinates for a stuff done flag. If these are 0 and 0, ignored. Otherwise,
//     the stuff done flag is set to 1 when the door is unlocked. If the flag is non-zero,
//     than when the party enters this zone, the door will ebcome unlocked.

//   4 - Town script run when the door is successfully opened.
//   5 - Lock difficulty. This value is separate from the "Lock level" above,
//     in that it allows the designer to let lock-picking and boor-bashing be
//     treated separately. If this is set to zero, it's ignored. If it is set
//     to -1, then the door is only jammed or barricaded, not locked.

beginterrainscript; 

variables;
	short i_am_open = 0;
	short cur_terrain;
	short i_am_locked = 0;
	
	short door_opened;
	short choice;
body;

beginstate INIT_STATE;
	cur_terrain = terrain_in_this_spot();
	if (((cur_terrain >= 14) && (cur_terrain <= 17)) ||
	  ((cur_terrain >= 50) && (cur_terrain <= 53)))
	  	i_am_open = 1;
	  	else i_am_open = 0;

	if (get_memory_cell(0) > 0) {
		i_am_locked = 1;
		if(get_memory_cell(5) <= 0)
			set_mechanism_difficulty(get_memory_cell(0));
		else
			set_mechanism_difficulty(get_memory_cell(5));
		set_physical_strength(get_memory_cell(0));
		
		if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0)) {
			if (get_sdf(get_memory_cell(2),get_memory_cell(3)) > 0)
				i_am_locked = 0;
			}
		}
		
	break;

beginstate START_STATE;
break;

beginstate SEARCH_STATE;
	cur_terrain = terrain_in_this_spot();
	if (((cur_terrain >= 14) && (cur_terrain <= 17)) ||
	  ((cur_terrain >= 50) && (cur_terrain <= 53)))
	  	i_am_open = 1;
	else
		i_am_open = 0;
	if (i_am_open == 1) {
		print_str_color("You close the door.",2);
		flip_terrain(my_loc_x(),my_loc_y());
		i_am_open = 0;
		play_sound(-59);
		}
break;

beginstate BLOCK_MOVE_STATE;
	//re-check the locks
	if (get_memory_cell(0) > 0) {
		i_am_locked = 1;
		if(get_memory_cell(5) <= 0)
			set_mechanism_difficulty(get_memory_cell(0));
		else
			set_mechanism_difficulty(get_memory_cell(5));
		set_physical_strength(get_memory_cell(0));
		
		if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0)) {
			if (get_sdf(get_memory_cell(2),get_memory_cell(3)) > 0)
				i_am_locked = 0;
			}
		}
	else
		i_am_locked = 0;


	cur_terrain = terrain_in_this_spot();
	if (((cur_terrain >= 14) && (cur_terrain <= 17)) ||
	  ((cur_terrain >= 50) && (cur_terrain <= 53)))
	  	i_am_open = 1;
	else 
		i_am_open = 0;

	if (i_am_open == 0) {
		block_entry(1);
		
		door_opened = 1;

		if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0)) {
			if (get_sdf(get_memory_cell(2),get_memory_cell(3)) > 0)
				i_am_locked = 0;
			}
		
		if ((get_memory_cell(1) > 0) && (i_am_locked > 0)) {
			if (has_special_item(get_memory_cell(1))) {
				print_str_color("You have the key which unlocks this door.",2);
				if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0))
					set_flag(get_memory_cell(2),get_memory_cell(3),1);
				i_am_locked = 0;
				}
			} 
		if (i_am_locked) {
			reset_dialog();
			if (get_memory_cell(1) > 0)
				add_dialog_str(0,"This door is locked, and you don't have the right key. You can have your strongest character try to bash it down or have your most skilled character try to pick the lock.",0);
			else if(get_memory_cell(5) >= 0) 
				add_dialog_str(0,"This door is locked. You can have your strongest character try to bash it down or have your most skilled character try to pick the lock.",0);
			else if(get_memory_cell(5) == -1)
				add_dialog_str(0,"This door is unlocked, but jammed. Maybe something's blocking it from the other side. You can have your strongest character try to bash it down if you want.",0);
			add_dialog_choice(0,"Leave the door alone.");
			add_dialog_choice(1,"Try to bash it down.");
			if(get_memory_cell(5) != -1)
				add_dialog_choice(2,"Try to pick the lock.");
			choice = run_dialog(0);
			
			if (choice == 1)
				end();
			if (choice == 2) {
				if (run_bash_door(get_physical_strength()) == FALSE)
					door_opened = 0;
				}
			if (choice == 3) {
				if (run_pick_lock(get_mechanism_difficulty()) == FALSE) 
					door_opened = 0;
					else if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0))
						award_party_xp(BASE_TRAP_XP,1 + 2 * get_mechanism_difficulty());
					
				}
			}
			
		if (door_opened) {
			print_str("You open the door.");
			if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0))
				set_flag(get_memory_cell(2),get_memory_cell(3),1);
			flip_terrain(my_loc_x(),my_loc_y());
			i_am_open = 1;
			i_am_locked = 0;
			play_sound(-58);
			if (get_memory_cell(4) != 0)

				run_town_script(get_memory_cell(4));
			}
		}
break;

beginstate UNLOCK_SPELL_STATE;
	cur_terrain = terrain_in_this_spot();
	if (((cur_terrain >= 14) && (cur_terrain <= 17)) ||
	  ((cur_terrain >= 50) && (cur_terrain <= 53)))
	  	i_am_open = 1;
	else 
		i_am_open = 0;
	
	if ((i_am_open > 0) || (i_am_locked == 0))
		print_str_color("Unlock Doors: The spell doesn't affect unlocked doors.",2);
		else {
			if (get_unlock_spell_strength() >= get_mechanism_difficulty() * 2) {
				print_str_color("Unlock Doors: The spell unlocks a door.",2);
				i_am_locked = 0;
				play_sound(9);
				if ((get_memory_cell(2) > 0) || (get_memory_cell(3) > 0))
					set_flag(get_memory_cell(2),get_memory_cell(3),1);
				}
				else {
					print_str_color("Unlock Doors: The spell isn't strong enough to affect the door.",2);
					print_str_color("  (This spell usually only affects doors with magical protection.)",2);
					}
			}
break;

beginstate DISPEL_BARRIER_STATE;
	cur_terrain = terrain_in_this_spot();
	if (((cur_terrain >= 14) && (cur_terrain <= 17)) ||
	  ((cur_terrain >= 50) && (cur_terrain <= 53)))
	  	i_am_open = 1;
	else 
		i_am_open = 0;
	
	if ((i_am_open == 0) && (i_am_locked)) {
		print_str_color("Dispel Barrier: The spell fails to affect a locked door.",2);
		}
break;
